const express = require('express');
const https = require('https');
const http = require('http');
const fs = require('fs');
const cors = require('cors');
const bodyParser = require('body-parser');

// 加载环境变量
require('dotenv').config();

// 导入路由
const authRoutes = require('./src/routes/authRoutes');
const payRoutes = require('./src/routes/payRoutes');
const orderRoutes = require('./src/routes/orderRoutes');
const productRoutes = require('./src/routes/productRoutes');
const statsRoutes = require('./src/routes/statsRoutes');

// V1.0.1 新增路由
const userAuthRoutes = require('./src/routes/userAuthRoutes');
const categoryRoutes = require('./src/routes/categoryRoutes');
const categoryAdminRoutes = require('./src/routes/categoryAdminRoutes');
const customerServiceRoutes = require('./src/routes/customerServiceRoutes');
const customerServiceAdminRoutes = require('./src/routes/customerServiceAdminRoutes');
const userManagementRoutes = require('./src/routes/userManagementRoutes');
const productAdminRoutes = require('./src/routes/productAdminRoutes');
const orderAdminRoutes = require('./src/routes/orderAdminRoutes');

// V1.0.2 新增路由 - 商品规格和评论功能
const specRoutes = require('./src/routes/specRoutes');
const specAdminRoutes = require('./src/routes/specAdminRoutes');
const reviewRoutes = require('./src/routes/reviewRoutes');
const reviewAdminRoutes = require('./src/routes/reviewAdminRoutes');

// V1.0.3 新增路由 - 系统配置管理
const configRoutes = require('./src/routes/configRoutes');
const configAdminRoutes = require('./src/routes/configAdminRoutes');

// V1.0.3 安全功能 - 管理员认证
const adminAuthRoutes = require('./src/routes/adminAuthRoutes');
const { adminAuth } = require('./src/middleware/adminAuth');

const logger = require('./src/utils/logger');

const app = express();

// CORS 配置（安全加固）
const config = require('./src/config/config');

const allowedOrigins = [
  'https://yourdomain.com',
  'https://www.yourdomain.com',
  'https://api.tiyue.work'  // 你的实际域名
];

// 开发环境允许本地
if (config.server.env === 'development') {
  allowedOrigins.push('http://localhost:5173');
  allowedOrigins.push('http://127.0.0.1:5173');
  allowedOrigins.push('http://localhost:3000');
}

app.use(cors({
  origin: function (origin, callback) {
    // 允许无origin的请求（如移动端、Postman）
    if (!origin) return callback(null, true);

    if (allowedOrigins.indexOf(origin) !== -1 || config.server.env === 'development') {
      callback(null, true);
    } else {
      logger.warn('CORS拦截了不允许的域名', { origin });
      callback(null, false);
    }
  },
  credentials: true
}));

// 静态文件服务 - 提供图片访问
const path = require('path');
app.use('/uploads', express.static(path.join(__dirname, 'uploads'), {
  maxAge: '1d', // 缓存1天
  etag: true,
  lastModified: true
}));

// 中间件
app.use(bodyParser.json({ limit: '10mb' }));  // 添加大小限制
app.use(bodyParser.urlencoded({ extended: true, limit: '10mb' }));
app.use(bodyParser.text({ type: 'text/xml', limit: '10mb' }));

// 路由 - 原有接口
app.use('/api/auth', authRoutes);  // 微信小程序登录（原有）
app.use('/api/pay', payRoutes);
app.use('/api/orders', orderRoutes);
app.use('/api/products', productRoutes);
app.use('/api/stats', statsRoutes);


// V1.0.1 新增路由 - 用户端接口（无需管理员认证）
app.use('/api/user-auth', userAuthRoutes);  // 用户注册/登录
app.use('/api/categories', categoryRoutes);  // 商品分类
app.use('/api/customer-service', customerServiceRoutes);  // 客服消息

// V1.0.2 新增路由 - 商品规格和评论功能（用户端）
app.use('/api/specs', specRoutes);  // 商品规格
app.use('/api/reviews', reviewRoutes);  // 商品评论

// V1.0.3 新增路由 - 系统配置（用户端）
app.use('/api/config', configRoutes);  // 系统配置

// V1.0.3 安全功能 - 管理员认证接口（无需认证）
app.use('/api/admin/auth', adminAuthRoutes);  // 管理员登录

// ========== 以下所有admin接口需要管理员认证 ==========
// V1.0.1 后台管理接口（需要管理员认证）
app.use('/api/admin/categories', adminAuth, categoryAdminRoutes);  // 分类管理
app.use('/api/admin/products', adminAuth, productAdminRoutes);  // 商品管理
app.use('/api/admin/users', adminAuth, userManagementRoutes);  // 用户管理
app.use('/api/admin/customer-service', adminAuth, customerServiceAdminRoutes);  // 客服管理
app.use('/api/admin/orders', adminAuth, orderAdminRoutes);  // 订单管理

// V1.0.2 后台管理接口（需要管理员认证）
app.use('/api/admin/specs', adminAuth, specAdminRoutes);  // 规格管理
app.use('/api/admin/reviews', adminAuth, reviewAdminRoutes);  // 评论管理

// V1.0.3 后台管理接口（需要管理员认证）
app.use('/api/admin/config', adminAuth, configAdminRoutes);  // 配置管理

// 根路径 - 系统信息（从数据库读取）
app.get('/', async (req, res) => {
  try {
    const db = require('./src/config/database');
    const [configs] = await db.query('SELECT * FROM system_config');

    // 转换为对象
    const configObj = {};
    configs.forEach(item => {
      configObj[item.config_key] = item.config_value;
    });

    res.json({
      success: true,
      name: configObj.system_name,
      version: configObj.system_version,
      description: configObj.system_description,
      features: [
        '用户管理（账号密码 + 手机验证码 + 游客模式）',
        '商品分类管理',
        '电子虚拟商品销售',
        '商品规格配置（V1.0.2新增）',
        '商品评论回复（V1.0.2新增）',
        '后台发货管理（V1.0.3新增）',
        '系统配置化（V1.0.3新增）',
        '微信支付集成',
        '在线客服系统',
        '订单管理',
        '数据统计分析'
      ],
      endpoints: {
        // 用户端接口
        userAuth: '/api/user-auth',
        wechatAuth: '/api/auth',
        products: '/api/products',
        categories: '/api/categories',
        specs: '/api/specs',
        reviews: '/api/reviews',
        orders: '/api/orders',
        payment: '/api/pay',
        customerService: '/api/customer-service',
        config: '/api/config',
        // 后台管理接口
        adminCategories: '/api/admin/categories',
        adminProducts: '/api/admin/products',
        adminSpecs: '/api/admin/specs',
        adminReviews: '/api/admin/reviews',
        adminUsers: '/api/admin/users',
        adminOrders: '/api/admin/orders',
        adminCustomerService: '/api/admin/customer-service',
        adminConfig: '/api/admin/config'
      }
    });
  } catch (error) {
    res.json(null);
  }
});

// 健康检查（从数据库读取配置）
app.get('/health', async (req, res) => {
  try {
    const db = require('./src/config/database');
    const [configs] = await db.query(
      "SELECT config_value FROM system_config WHERE config_key IN ('system_name', 'system_version')"
    );

    let systemName = '';
    let systemVersion = '';

    configs.forEach(item => {
      if (item.config_key === 'system_name') systemName = item.config_value;
      if (item.config_key === 'system_version') systemVersion = item.config_value;
    });

    res.json({
      status: 'ok',
      system: systemName,
      version: systemVersion,
      timestamp: new Date().toISOString()
    });
  } catch (error) {
    res.json(null);
  }
});

// 错误处理
app.use((err, req, res, next) => {
  logger.error('系统错误', { error: err.message });
  res.status(500).json({
    success: false,
    message: err.message || '服务器内部错误'
  });
});

// 404处理
app.use((req, res) => {
  res.status(404).json({
    success: false,
    message: '接口不存在'
  });
});

// HTTPS 配置
// ⚠️ 修改为你的证书路径
const sslKeyPath = process.env.SSL_KEY_PATH;
const sslCertPath = process.env.SSL_CERT_PATH;

// 检查证书文件是否存在
if (!fs.existsSync(sslKeyPath) || !fs.existsSync(sslCertPath)) {
  console.error('❌ SSL证书文件不存在！');
  console.error('请确保证书文件在以下位置：');
  console.error('  私钥：' + sslKeyPath);
  console.error('  证书：' + sslCertPath);
  console.error('');
  console.error('或者在 .env 文件中配置：');
  process.exit(1);
}

const httpsOptions = {
  key: fs.readFileSync(sslKeyPath),
  cert: fs.readFileSync(sslCertPath)
};

// 创建 HTTPS 服务器
const httpsServer = https.createServer(httpsOptions, app);
const httpsPort = process.env.HTTPS_PORT || 443;

httpsServer.listen(httpsPort, () => {
  logger.success(`HTTPS 服务器启动成功，运行在端口 ${httpsPort}`);
});

// 可选：同时启动 HTTP 服务器，自动重定向到 HTTPS
const httpPort = process.env.PORT || 80;
const httpApp = express();

httpApp.use((req, res) => {
  res.redirect(301, `https://${req.headers.host}${req.url}`);
});

const httpServer = http.createServer(httpApp);
httpServer.listen(httpPort, () => {
  logger.info(`HTTP 服务器启动，自动重定向到 HTTPS`);
});

// 错误处理
httpsServer.on('error', (error) => {
  logger.error('HTTPS 服务器错误', { error: error.message });
  process.exit(1);
});

httpServer.on('error', (error) => {
  logger.error('HTTP 服务器错误', { error: error.message });
});

